package com.hqyj.javaSpringBoot.modules.test.entity;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.hqyj.javaSpringBoot.modules.common.entiy.AbstractEntity;

import javax.persistence.*;
import java.util.List;

@Entity
@Table(name = "test_student")
public class Student extends AbstractEntity {
    private String studentName;
    /**
     * 使用 Hibernate 时，属性最好不要使用基本类型，而要使用包装类型，
     * 因为在使用 findByExample() 操作时，基本类型字段总是会加入到 WHERE 条件，
     * 需要我们手 动排除掉
     */
    private Integer age;
    private String sex;

    /**
     * 学生和学生卡一对一关系
     * OneToOne：一对一关系中，有外键方使用 JoinColumn 注解，另一方使用 mappedBy 属性（可选)
     * targetEntity：目标实体
     * cascade：联级操作
     *      CascadeType.REMOVE       删除当前 Bean 时，与它有映射关系的 Bean 也 会跟着被删除；
     *      CascadeType.MERGE       变更当前 Bean 时，更新与之映射的 Bean；
     *      CascadeType.DETACH      如果你要删除一个 Bean，但是它有外键无法删 除，
     *                              你就需要这个级联权限了，它会撤销所有相关的外键关联
     *      CascadeType.REFRESH     级联刷新
     *      CascadeType.ALL         拥有全部权限
     * fetch：加载数据策略
     *      FetchType.LAZY ---- 懒加载，加载一个 Bean 时，定义懒加载的属性不会马 上从数据库中加载；
     *      FetchType.EAGER ---- 急加载，加载一个 Bean 时，定义急加载的属性会立 即从数据库中加载；
     * JoinColumn  产生外键
     * name 对应 test_student 表中 card_id 外键列
     */
    @OneToOne(targetEntity = Card.class,cascade = CascadeType.ALL,
                fetch = FetchType.EAGER)
    @JoinColumn(name = "card_id",unique = true)
    private Card studentCard;

    /**
     * 学生和班级多对多
     * ManyToMany，一方使用 JoinTable 注解，另一方配置 mappedBy 属性（中间表）
     * cascade：联级操作
     * fetch：加载数据策略
     * JsonIgnore：不序列化该字段，避免无限递归
     * mappedBy
     *  只有@OneToOne，@OneToMany，@ManyToMany上才有mappedBy属性，ManyToOne不存在该属性
     *
     */
    @ManyToMany(mappedBy = "students",cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JsonIgnore
    private List<Clazz> clazzes;

    public String getStudentName() {
        return studentName;
    }

    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Card getStudentCard() {
        return studentCard;
    }

    public void setStudentCard(Card studentCard) {
        this.studentCard = studentCard;
    }

    public List<Clazz> getClazzes() {
        return clazzes;
    }

    public void setClazzes(List<Clazz> clazzes) {
        this.clazzes = clazzes;
    }


}
